package org.footballmanager.pandafootball.system.service.impl;

import org.footballmanager.pandafootball.common.BaseDao;
import org.footballmanager.pandafootball.common.annotation.SystemServiceLog;
import org.footballmanager.pandafootball.common.constants.Constants;
import org.footballmanager.pandafootball.system.domain.CalculateEntity;
import org.footballmanager.pandafootball.system.domain.FootBfinfo;
import org.footballmanager.pandafootball.system.service.RepeatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * 服务抽象类
 * 用于抽象出一些已知的服务，如根据主键获取唯一记录、保存记录等方法
 * 继承此类可以省去 大部分重复代码
 *
 * @author chenjian
 * @since 2017年9月27日上午10:57:28
 */
public abstract class RepeatServiceImpl<T extends CalculateEntity> extends RepeatMainServiceImpl<T> implements RepeatService<T> {
	@Autowired
	BaseDao<T> baseDao;

	/**
	 * 保存记录
	 * @param entity 参数
     * @param request 参数
     * @return 返回值
	 */
	@Override
	@Transactional
	@SystemServiceLog(description = "保存记录")
	public int save(T entity, HttpServletRequest request){
		/*根据胜平负球数算出:
		场次（带过来） = 报分次数
		胜平负相加 （带过来） = 场次
		进球（带过来）=所有报分里这个球队进球累加
		失球（带过来）=所有报分里这个球队失球累加
		净胜球 = 进球-失球
		胜率 = 胜 ÷ 场次
		积分 = 胜*3 + 平*1 + 负*0  */
		entity.setJsq(entity.getJq() - entity.getSq());
		if(entity.getBscc() != 0){
			Double result = Double.parseDouble(entity.getS().toString()) / Double.parseDouble(entity.getBscc().toString());
			entity.setSl(result);
		}
		entity.setJf(entity.getS() * 3 + entity.getP());
	    if(request != null){
            entity.setCreateId((Long)request.getSession().getAttribute(Constants.USERID));
            entity.setUpdateId((Long)request.getSession().getAttribute(Constants.USERID));
        }
		entity.setCreateTime(new Date());
		entity.setUpdateTime(new Date());
		return baseDao.insert(entity);
	}

    @Override
    @Transactional
    public int updateNotNull(T entity, HttpServletRequest request) {
        entity.setJsq(entity.getJq() - entity.getSq());
        if(entity.getBscc() != 0){
            double result = (double)entity.getS() / entity.getBscc();
            entity.setSl(result);
        }
        entity.setJf(entity.getS() * 3 + entity.getP());
        entity.setUpdateId((Long)request.getSession().getAttribute(Constants.USERID));
        entity.setUpdateTime(new Date());
        this.reComputeRanking(request);
        return baseDao.updateByPrimaryKeySelective(entity);
    }

    /**
     * 重新计算排名
     * @param request 请求
     */
    @SystemServiceLog(description = "重新计算排名")
    public abstract void reComputeRanking(HttpServletRequest request);

	/**
	 * 处理报分后续功能加分
	 * @param zhufc 主场球队
	 * @param kefc 客场球队
	 * @param bf 报分实体
	 * @param request 请求
	 */
	@Override
	@SystemServiceLog(description = "处理报分后续功能加分")
	public void processAdd(T zhufc, T kefc, FootBfinfo bf, HttpServletRequest request) {
		if(zhufc != null && kefc != null){
			zhufc.setJq(zhufc.getJq() + bf.getJq1());
			zhufc.setSq(zhufc.getSq() + bf.getJq2());

			kefc.setJq(kefc.getJq() + bf.getJq2());
			kefc.setSq(kefc.getSq() + bf.getJq1());
		}
		super.processAdd(zhufc, kefc, bf, request);
	}

	/**
	 * 处理报分后续功能减分
	 * @param zhufc 主场球队
	 * @param kefc 客场球队
	 * @param bf 报分实体
	 * @param request 请求
	 */
	@Override
	@SystemServiceLog(description = "处理报分后续功能减分")
	public void processDelete(T zhufc, T kefc, FootBfinfo bf, HttpServletRequest request) {
		if(zhufc != null && kefc != null){
			zhufc.setJq(zhufc.getJq() - bf.getJq1());
			zhufc.setSq(zhufc.getSq() - bf.getJq2());

			kefc.setJq(kefc.getJq() - bf.getJq2());
			kefc.setSq(kefc.getSq() - bf.getJq1());
		}
		super.processDelete(zhufc, kefc, bf, request);
	}

}
